public class UC {

	public CPU cpu;
	public IR ir;
	public GeradorEndereco geradorEndereco;
	public REndUC renduc;
	public CircuitoControle circuitoControle;
	public GeradorTempos geradorTempos;
	public RegControle regControle;
	public MemoriaControle memoriaControle;
	private ULA ula;

	public boolean halt;

	private String instrucaoCorrente;
	public int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z;

	public UC(CPU cpu) {
		halt = false;
		this.cpu = cpu;
		this.geradorEndereco = new GeradorEndereco(this);
		this.renduc = new REndUC(geradorEndereco);
		this.memoriaControle = new MemoriaControle(renduc);
		this.regControle = new RegControle(memoriaControle);
		geradorEndereco.regControle = regControle;
		this.circuitoControle = new CircuitoControle(this, regControle);
		this.geradorTempos = new GeradorTempos(circuitoControle);
	}

	public void proximaMicro()
	{
		geradorTempos.T1();
		geradorTempos.T2();
		geradorTempos.T3();
	}

	public void proximaInstrucao()
	{
		instrucaoCorrente = cpu.memoria.instrucao[cpu.rend.getValor()]; 
		if(instrucaoCorrente.equals(""))
		{
			while(cpu.memoria.instrucao[cpu.rend.getValor()].equals(""))
				proximaMicro();
		}

		while(cpu.memoria.instrucao[cpu.rend.getValor()].equals(instrucaoCorrente) ||
			  cpu.memoria.instrucao[cpu.rend.getValor()].equals(""))
			proximaMicro();
	}

	public void rodarDireto()
	{
		while(!halt) proximaMicro();
	}

	public void atualizarValor()
	{
		/*
		String control = getFlags("UC");
		//if(control == "0")  fazer nada
		if(control == "1") ir.getValor();
		*/
	}

	public String getSinais(String componente)
	{
		if(componente.equals("R0")) return Integer.toString(a);
		else if(componente.equals("R1")) return Integer.toString(b);
		else if(componente.equals("R2")) return Integer.toString(c);
		else if(componente.equals("PC")) return Integer.toString(d);
		else if(componente.equals("R3")) return Integer.toString(e);
		else if(componente.equals("R4")) return Integer.toString(f);
		else if(componente.equals("RGhost")) return Integer.toString(g);
		else if(componente.equals("RDados")) return Integer.toString(i);
		else if(componente.equals("Memoria")) return Integer.toString(v);
		else if(componente.equals("REnd")) return Integer.toString(j);
		else if(componente.equals("IR")) return Integer.toString(h);
		else if(componente.equals("MUX")) return Integer.toString(o);
		else if(componente.equals("MUXA")) return Integer.toString(m) + Integer.toString(n);
		else if(componente.equals("MUXB")) return Integer.toString(k) + Integer.toString(l);
		//else if(componente.equals("UC") return Integer.toString(j) + Integer.toString(k);
		else if(componente.equals("GeradorEndereco")) return Integer.toString(w) + Integer.toString(x);
		else if(componente.equals("ULA"))
			return Integer.toString(p) + Integer.toString(q) + Integer.toString(r) +
			       Integer.toString(s) + Integer.toString(t) + Integer.toString(u);
		else System.out.println("Erro em getFlags() na UC");
		return "";
	}
/*
	public void mudarSinal(String letra, int sinal)
	{
		if(letra.equals("a")) a = sinal;
		else if(letra.equals("b")) b = sinal;
		else if(letra.equals("c")) c = sinal;
		else if(letra.equals("d")) d = sinal;
		else if(letra.equals("e")) e = sinal;
		else if(letra.equals("f")) f = sinal;
		else if(letra.equals("g")) g = sinal;
		else if(letra.equals("h")) h = sinal;
		else if(letra.equals("i")) i = sinal;
		else if(letra.equals("j")) j = sinal;
		else if(letra.equals("k")) k = sinal;
		else if(letra.equals("l")) l = sinal;
		else if(letra.equals("m")) m = sinal;
		else if(letra.equals("n")) n = sinal;
		else if(letra.equals("o")) o = sinal;
		else if(letra.equals("p")) p = sinal;
		else if(letra.equals("q")) q = sinal;
		else if(letra.equals("r")) r = sinal;
		else if(letra.equals("s")) s = sinal;
		else if(letra.equals("t")) t = sinal;
		else if(letra.equals("u")) u = sinal;
		else if(letra.equals("v")) v = sinal;
		else if(letra.equals("w")) w = sinal;
		else if(letra.equals("x")) x = sinal;
		else if(letra.equals("y")) y = sinal;
		else if(letra.equals("z")) z = sinal;

		cpu.atualizarValoresT1();
		cpu.atualizarValoresT3();
	}
*/
	private String toBinaryString(int n)
	{
		String entrada = Integer.toBinaryString(n);
		String zeros = "";
		for (int i = 0; i < 32 - entrada.length(); i++) {
			zeros += "0";
		}

		String saida = zeros + entrada;

		return saida;
	}

	public void mudarSinaisT1(String valor)
	{
		a = 0;
		b = 0;
		c = 0;
		d = 0;
		e = 0;
		f = 0;
		g = 0;
		h = 0;
		i = 0;
		j = 0;
		k = Integer.parseInt(valor.substring(10,11 ));
		l = Integer.parseInt(valor.substring(11,12 ));
		m = Integer.parseInt(valor.substring(12,13 ));
		n = Integer.parseInt(valor.substring(13,14 ));
		o = Integer.parseInt(valor.substring(14,15 ));
		p = Integer.parseInt(valor.substring(15,16 ));
		q = Integer.parseInt(valor.substring(16,17 ));
		r = Integer.parseInt(valor.substring(17,18 ));
		s = Integer.parseInt(valor.substring(18,19 ));
		t = Integer.parseInt(valor.substring(19,20 ));
		u = Integer.parseInt(valor.substring(20,21 ));
		v = 1;
		w = 0;
		x = Integer.parseInt(valor.substring(23,24 ));
		//y = Integer.parseInt(valor.substring(24,25 ));
		//z = Integer.parseInt(valor.substring(25,26 ));

		cpu.atualizarValoresT1();
	}


	public void mudarSinaisT3(String valor)
	{
		a = Integer.parseInt(valor.substring(0, 1));
		b = Integer.parseInt(valor.substring(1, 2));
		c = Integer.parseInt(valor.substring(2, 3));
		d = Integer.parseInt(valor.substring(3, 4));
		e = Integer.parseInt(valor.substring(4, 5));
		f = Integer.parseInt(valor.substring(5, 6));
		g = Integer.parseInt(valor.substring(6, 7));
		h = Integer.parseInt(valor.substring(7, 8));
		i = Integer.parseInt(valor.substring(8, 9));
		j = Integer.parseInt(valor.substring(9, 10));
		k = Integer.parseInt(valor.substring(10,11 ));
		l = Integer.parseInt(valor.substring(11,12));
		m = Integer.parseInt(valor.substring(12,13));
		n = Integer.parseInt(valor.substring(13,14));
		o = Integer.parseInt(valor.substring(14,15));
		p = Integer.parseInt(valor.substring(15,16));
		q = Integer.parseInt(valor.substring(16,17));
		r = Integer.parseInt(valor.substring(17,18));
		s = Integer.parseInt(valor.substring(18,19));
		t = Integer.parseInt(valor.substring(19,20));
		u = Integer.parseInt(valor.substring(20,21));
		v = Integer.parseInt(valor.substring(21,22));
		w = Integer.parseInt(valor.substring(22,23));
		x = Integer.parseInt(valor.substring(23,24));
		//y = Integer.parseInt(valor.substring(24,25));
		//z = Integer.parseInt(valor.substring(25,26 ));

		cpu.atualizarValoresT3();
	}

	public void setIR(IR ir)
	{
		this.ir = ir;
		geradorEndereco.setIR(ir);
	}

	public void setULA(ULA ula) {
		this.ula = ula;
		geradorEndereco.setULA(ula);
	}
}

